package lambda04;

import org.junit.Test;

public class LambdaDemo05 {
    @Test
    public void test(){
        method("你好，Lambda表达式",(String str)->{
            System.out.println(str); // 你好，Lambda表达式
        });
    }

    public void method(String str, Printer p) {
        p.print(str);
    }

    @Test
    public void test02() {
        Printer p = str -> System.out.println(str);
        System.out.println(p);
        for (Class<?> in : p.getClass().getInterfaces()) {
            System.out.println(in);
            // lanbda04.LambdaDemo05$$Lambda/0x0000021f2b019b48@649d209a
            //interface lanbda04.Printer
        }
    }

    @Test
    public void test03() {
        Printer p = str -> System.out.println(str);
              //相当于 Printer p = new LambdaDemo05$$lambda$1();//多态
        p.print("abc");// abc
    }
}

/*
 //在运行时,JVM会为这个Lambda表达式对应的接口创建一个实现类
 //重写该接口中的抽象方法,重写的目标对应Lambda表达式{}中内容
 //该实现类是一个内部类
 // 每个Lambda表达式对应的是一个实现类
 public class LambdaDemo05 {
    @Test
     public void test01() {
      method("你好Lambda表达式",new LambdaDemo05$$lambda$1());
   }
   public void  method(String str, Printer p) {//String str="你好Lambda表达式"
                                               //Printer p= new LambdaDemo05$$lambda$1();//多态
      p.print(str);//最终相当于调用实现类中的print(String str)方法
   }

  //在程序运行时期,会生成这个Lambda表达式对应的接口的一个实现类
    class LambdaDemo05$$Lambda$1 implements Printer{
        //重写抽象方法
        public void print(String str){  //String str="你好Lambda表达式"
           System.out.println(str);  //对应该Lambda表达式{}中内容
        }
    }
  }
* */